package main

import (
	"fmt"

	"github.com/ahviplc/GoJustToolc/UConsole"

	"github.com/spf13/viper"
)

func main() {
	// 读取toml文件
	v := viper.New()
	// 设置读取的配置文件名
	v.SetConfigName("config") // config.json 所以填写为config
	// 设置配置文件类型
	v.SetConfigType("toml")
	// windows环境下为%GOPATH，linux环境下为$GOPATH
	// config下
	v.AddConfigPath("tomlConfig") // 均可以: tomlConfig   /tomlConfig   ./tomlConfig/   ./tomlConfig/.

	if err := v.ReadInConfig(); err != nil {
		fmt.Printf("err:%s\n", err)
	}

	// 打印
	UConsole.PrintAStraightLine()
	fmt.Println(v.AllKeys())
	// fmt.Println(v.AllowEmptyEnv) // 0x7f2800
	UConsole.PrintAStraightLine()
	for k, v := range v.AllKeys() {
		fmt.Println(k, " -> ", v)
	}
	UConsole.PrintAStraightLine()
	fmt.Println(v.AllSettings())
	UConsole.PrintAStraightLine()
	for k, v := range v.AllSettings() {
		fmt.Println(k, " -> ", v)
	}
	UConsole.PrintAStraightLine()
	UConsole.PrintAStraightLine()
	allSettingsMap := v.AllSettings()

	// 开始遍历子map
	UConsole.Log("循环遍历key为server的子Map,结果如下:")
	// 使用【.(map[string]interface{})】将【allSettingsMap["server"]】强制转成map
	// 使用类型断言 if serverMap, ok := allSettingsMap["server"].(map[int]interface{})
	// 如果 allSettingsMap["server"]是(map[int]interface{})类型的话,ok就是true,serverMap就是(map[int]interface{})类型allSettingsMap["server"]的值.
	// 否则ok为false，serverMap就是(map[int]interface{})类型的初始化 nil
	if serverMap, ok := allSettingsMap["server"].(map[string]interface{}); ok {
		UConsole.Log("类型转换成功:", ok)
		for k, v := range serverMap {
			fmt.Println(k, " -> ", v)
		}
	} else {
		UConsole.Log("无效的类型转换:", ok) // 如果无效类型转换 则 serverMap 会是初始值 nil
	}
	UConsole.PrintAStraightLine()
	UConsole.PrintAStraightLine()
	UConsole.Log("循环遍历key为logger的子Map,结果如下:")
	// 使用【.(map[string]interface{})】将【allSettingsMap["logger"]】强制转成map
	// 使用类型断言 if loggerMap, ok := allSettingsMap["logger"].(map[int]interface{})
	// 如果 allSettingsMap["logger"]是(map[int]interface{})类型的话,ok就是true,loggerMap就是(map[int]interface{})类型allSettingsMap["logger"]的值.
	// 否则ok为false，loggerMap就是(map[int]interface{})类型的初始化 nil
	if loggerMap, ok := allSettingsMap["logger"].(map[string]interface{}); ok {
		UConsole.Log("类型转换成功:", ok)
		for k, v := range loggerMap {
			fmt.Println(k, " -> ", v)
		}
	} else {
		UConsole.Log("无效的类型转换:", ok) // 如果无效类型转换 则 loggerMap 会是初始值 nil
	}
	UConsole.PrintAStraightLine()
	UConsole.PrintAStraightLine()
	UConsole.Log("循环遍历key为viewer的子Map,结果如下:")
	// 使用【.(map[string]interface{})】将【allSettingsMap["viewer"]】强制转成map
	// 使用类型断言 if viewerMap, ok := allSettingsMap["viewer"].(map[int]interface{})
	// 如果 allSettingsMap["viewer"]是(map[int]interface{})类型的话,ok就是true,viewerMap就是(map[int]interface{})类型allSettingsMap["viewer"]的值.
	// 否则ok为false，viewerMap就是(map[int]interface{})类型的初始化 nil
	if viewerMap, ok := allSettingsMap["viewer"].(map[string]interface{}); ok {
		UConsole.Log("类型转换成功:", ok)
		for k, v := range viewerMap {
			fmt.Println(k, " -> ", v)
		}
	} else {
		UConsole.Log("无效的类型转换:", ok) // 如果无效类型转换 则 viewerMap 会是初始值 nil
	}
	UConsole.PrintAStraightLine()
	UConsole.PrintAStraightLine()
	UConsole.Log("循环遍历key为database的子Map,结果如下:")
	// 使用【.(map[string]interface{})】将【allSettingsMap["database"]】强制转成map
	// 使用类型断言 if databaseMap, ok := allSettingsMap["database"].(map[int]interface{})
	// 如果 allSettingsMap["database"]是(map[int]interface{})类型的话,ok就是true,databaseMap就是(map[int]interface{})类型allSettingsMap["database"]的值.
	// 否则ok为false，databaseMap就是(map[int]interface{})类型的初始化 nil
	if databaseMap, ok := allSettingsMap["database"].(map[string]interface{}); ok {
		UConsole.Log("类型转换成功:", ok)
		for k, v := range databaseMap {
			fmt.Println(k, " -> ", v)
		}
	} else {
		UConsole.Log("无效的类型转换:", ok) // 如果无效类型转换 则 databaseMap 会是初始值 nil
	}
	UConsole.PrintAStraightLine()
	UConsole.PrintAStraightLine()
	UConsole.Log("循环遍历key为swagger的子Map,结果如下:")
	// 使用【.(map[string]interface{})】将【allSettingsMap["swagger"]】强制转成map
	// 使用类型断言 if swaggerMap, ok := allSettingsMap["swagger"].(map[int]interface{})
	// 如果 allSettingsMap["swagger"]是(map[int]interface{})类型的话,ok就是true,swaggerMap就是(map[int]interface{})类型allSettingsMap["swagger"]的值.
	// 否则ok为false，swaggerMap就是(map[int]interface{})类型的初始化 nil
	if swaggerMap, ok := allSettingsMap["swagger"].(map[string]interface{}); ok {
		UConsole.Log("类型转换成功:", ok)
		for k, v := range swaggerMap {
			fmt.Println(k, " -> ", v)
		}
	} else {
		UConsole.Log("无效的类型转换:", ok) // 如果无效类型转换 则 swaggerMap 会是初始值 nil
	}
	UConsole.PrintAStraightLine()
}
